package com.star.links.main;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;


import com.star.links.R;
import com.star.links.Service.Impl.PlayServiceImpl;
import com.star.links.Service.PlayService;
import com.star.links.configure.PlayConfigure;
import com.star.links.views.Block;
import com.star.links.views.MyView;

import java.util.Timer;
import java.util.TimerTask;

public class link extends Activity {
        // 游戏配置对象
        private PlayConfigure config;
        // 游戏业务逻辑接口
        private PlayService playService;
        //重置按钮
        private Button resetButton;
        // 游戏界面
        private MyView myView;
        // 记录是否处于游戏状态
        private boolean isPlaying;
        // 记录已经选中的方块
        private Block selected = null;
        //定时器
        private Timer timer=new Timer();
        //记录剩余时间
        private int remainingTime;
        //展示剩余时间
        private TextView timeTextView;
        //消息处理
        private Handler handler = new Handler()
        {
            public void handleMessage(Message msg)
            {
                switch (msg.what)
                {
                    case 0x123:
                        timeTextView.setText("剩余时间： " +remainingTime);
                        remainingTime--;
                        // 时间小于0, 游戏失败
                        if (remainingTime < 0)
                        {
    //                        stopTimer();
    //                        // 更改游戏的状态
    //                        isPlaying = false;
    //                        lostDialog.show();
    //                        return;
                        }
                        break;
                }
            }
        };

        @Override
        public void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            // 初始化界面
            init();
            myView.startGame();
            startTime(100);
        }

        // 初始化游戏的方法
        private void init()
        {
            config = new PlayConfigure(8, 9, 0, 0, this);
            //设置游戏难度
            config.setDifficulty(0);
            // 得到游戏区域对象
            myView = (MyView) findViewById(R.id.myView);
            //获取重排按钮
            resetButton=findViewById(R.id.resetButton);
            //获取展示剩余时间的文本框
            timeTextView=findViewById(R.id.timeText);
            //获取服务接口
            playService = new PlayServiceImpl(this.config);
            myView.setPlayService(playService);

            //为重排按钮设置监听事件
            resetButton.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    playService.reset();
                    myView.postInvalidate();
                }
            });

            // 为游戏区域的触碰事件绑定监听器
            this.myView.setOnTouchListener(new View.OnTouchListener() {
                @Override
                public boolean onTouch(View view, MotionEvent motionEvent) {
                    if(motionEvent.getAction()==MotionEvent.ACTION_DOWN){
                        myViewTouchDown(motionEvent);
                    }
                    if (motionEvent.getAction()==MotionEvent.ACTION_UP){
                        myViewTouchUp(motionEvent);
                    }
                    return true;
                }
            });


        }
        @Override
        protected void onPause()
        {
            super.onPause();
        }
        @Override
        protected void onResume()
        {
            super.onResume();
        }

        //按下游戏区域的处理方法
        private void myViewTouchDown(MotionEvent event){
            Block[][] blocks=playService.getBlocks();
            float x = event.getX();
            float y = event.getY();
            Block currentBlock=playService.findBlock(x,y);
            if (currentBlock==null){
                return;
            }
//            this.myView.setSelectedBlock(block);
            if(this.selected==null){
                this.selected=currentBlock;
                this.myView.postInvalidate();
                return;
            }
            if(this.selected!=null)
            {
                boolean flag=this.playService.isLink(this.selected,currentBlock);
                if(!flag){
                    this.selected=currentBlock;
                    this.myView.postInvalidate();
                }else {
                    handleSuccessLink(this.selected,currentBlock,blocks);
                }
            }
        }


        // 松开游戏区域的处理方法
        private void myViewTouchUp(MotionEvent event)
        {
            this.myView.postInvalidate();
        }

        // 以gameTime作为剩余时间开始或恢复游戏
        private void startTime(int remainingTime)
        {
            // 如果之前的timer还未取消，取消timer
            if (this.timer != null)
            {
                stopTimer();
            }
            // 重新设置游戏时间
            this.remainingTime = remainingTime;
            // 如果游戏剩余时间与总游戏时间相等，即为重新开始新游戏
            if(remainingTime == PlayConfigure.DEFAULT_TIME)
            {
                // 开始新的游戏游戏
                myView.startGame();
            }
            isPlaying = true;
            this.timer = new Timer();
            // 定时任务，调用schedule方法后延迟0毫秒执行run方法，随后每隔1000毫秒执行一次run方法
            this.timer.schedule(new TimerTask()
            {
                public void run()
                {
                    handler.sendEmptyMessage(0x123);
                }
            }, 0, 1000);
            // 将选中方块设为null。
            this.selected = null;
        }

        private void stopTimer(){
            //停止计时器
            this.timer.cancel();
            this.timer=null;
        }

    private void handleSuccessLink( Block preBlock, Block currentBlock, Block[][] blocks)
        {


            this.myView.postInvalidate();
            // 将两个Piece对象从数组中删除
            blocks[preBlock.getIndexX()][preBlock.getIndexY()] = null;
            blocks[currentBlock.getIndexX()][currentBlock.getIndexY()] = null;
            // 将选中的方块设置null。
            this.selected = null;
            // 判断是否还有剩下的方块, 如果没有, 游戏胜利
            if (!this.playService.hasBlocks())
            {
                // 更改游戏状态
                isPlaying = false;
            }

        }

}
